/* Copyright 2013 University of Padua, Italy
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package it.dei.unipd.healthservice.servlet;

import it.dei.unipd.healthservice.resource.*;
import it.dei.unipd.healthservice.database.*;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet per visionare i dettagli di un ordine fatto da un cliente
* 
* @author Giorgio Vitale
* @version 1.00
*/
public class ViewDettagliOrdineClienteServlet extends AbstractDatabaseServlet {

	/**
	 * Visualizza i dettagli di un ordine
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException{
		doGet(req, res);
	} 

	/**
	 * Visualizza i dettagli di un ordine
	 * 
	 * @param req
	 *            la richiesta ricevuta dal client.
	 * @param res
	 *            la rispota fornita dal server.
	 * 
	 * @throws ServletException
	 *             se ci sono problemi nell'esecuzione della servlet.
	 * @throws IOException
	 *             se ci sono problemi nella comunicazione client-server.
	 */
	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		//se la sede centrale non e' loggata, redirige alla pagina di login
		String loginSedeCentrale = (String)req.getSession().getAttribute("login");
		if(loginSedeCentrale==null || !loginSedeCentrale.equals("sedecentrale")){
			res.sendRedirect("login_fabbrica.jsp");
			return;
		}
		
		String address = "/jsp/view_dettagli_ordini_cliente.jsp";
		RequestDispatcher dispatcher = req.getRequestDispatcher(address);
		Connection con = null;
		int idOrdine = 0;
		try{
			String id = req.getParameter("id");
			if (id==null) throw new IllegalArgumentException();
			idOrdine = Integer.parseInt(id);
		}
		catch(Exception e){
			req.setAttribute("errore", "Errore: ID mancante.");
			dispatcher.forward(req, res);
			return;
		}

		//ottiene le informazioni sull'ordine
		Ordine ordine = null;
		try {
			con = DS.getConnection();
			ordine = new ViewOrdiniClientiDatabase(con, idOrdine).viewOrdine();
			if (ordine==null){
				req.setAttribute("errore", "ID indicato non presente.");
				dispatcher.forward(req, res);
				return;
			}
			req.setAttribute("ordine", ordine);
		} catch (NullPointerException e) {
			req.setAttribute("errore", "Impossibile creare la connessione al database.(1)");
			dispatcher.forward(req, res);
			return;		
		} catch (SQLException e) {
			req.setAttribute("errore", "Errore durante l'accesso al database(1):"+e.getMessage());
			dispatcher.forward(req, res);
			return;
		}
		
		//aggiorna i dati
		if (req.getParameter("edit")!=null){
			int codice = ordine.getCodice();
			
			String stato = req.getParameter("stato");
			if (stato!=null && !stato.equals(Ordine.IN_ATTESA) && !stato.equals(Ordine.IN_CARICO) && !stato.equals(Ordine.SPEDITO))
				stato = null;
			
			java.util.Date date = ordine.getDataOrdine();
			try{date = new java.text.SimpleDateFormat("yyyy-MM-dd").parse(req.getParameter("dataordine"));
			}catch (Exception e){}
			java.sql.Date dataOrdine = null;
			if (date!=null) dataOrdine = new java.sql.Date(date.getTime());
			
			date = ordine.getDataSpedizione();
			try{date = new java.text.SimpleDateFormat("yyyy-MM-dd").parse(req.getParameter("dataspedizione"));
			}catch (Exception e){}
			java.sql.Date dataSpedizione = null;
			if (date!=null) dataSpedizione = new java.sql.Date(date.getTime());
			
			int idRecapito = ordine.getIdRecapito();
			String mail = ordine.getMail();
			Ordine edit = new Ordine(codice, dataOrdine, dataSpedizione, stato, idRecapito, mail);
			//aggiorna
			try {
				con = DS.getConnection();
				new UpdateOrdineClienteDatabase(con, edit).update();
				ordine = edit;
				req.setAttribute("ordine", edit);
				req.setAttribute("completato", "ok");
			} catch (NullPointerException e) {
				req.setAttribute("errore", "Impossibile creare la connessione al database.(2)");
				dispatcher.forward(req, res);
				return;		
			} catch (SQLException e) {
				req.setAttribute("errore", "Errore durante l'accesso al database(2):"+e.getMessage());
				req.setAttribute("ordine", edit);
				dispatcher.forward(req, res);
				return;
			}
		}
		
		//carica l'elenco dei prodotti che compongono l'ordine
		try {
			con = DS.getConnection();
			List<ElementoOrdineCliente> elementi = new ViewComposizioneOrdineClienteDatabase(con, ordine.getCodice()).search();
			req.setAttribute("elementi", elementi);
		} catch (NullPointerException e) {
			req.setAttribute("errore", "Impossibile creare la connessione al database.");
			dispatcher.forward(req, res);
			return;		
		} catch (SQLException e) {
			req.setAttribute("errore", "Errore durante l'accesso al database(3):"+e.getMessage());
			dispatcher.forward(req, res);
			return;
		}
		dispatcher.forward(req, res);
	}
}
